Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

157
Views
Firebase 9, Remix: addDoc() devuelve el error "PERMISO DENIED"

Tengo una aplicación de remezclas que usa firebase y una base de datos firestore.

El inicio de sesión funciona bien, GET /documents también (no hay reglas para GET)

Cuando intento crear un nuevo documento con addDoc() , aparece el error PERMISSION DENIED .

Mis reglas:

 rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow create, update, delete: if request.auth != null && request.auth.token.email_verified && request.auth.token.email == 'my_email@gmail.com'; allow read: if true; } } }

Como uso Remix (SSR), estoy inicializando firebase en el lado del cliente:

 if (getApps().length === 0) { initializeApp({ apiKey: "...", authDomain: "...", projectId: "...", storageBucket: "...", messagingSenderId: "...", appId: "...", measurementId: "...", }); }

Y tengo firebase-admin en el lado del servidor:

 const serviceAccount = require("~/firebase-service-account.json"); serviceAccount.private_key_id = process.env.FIREBASE_PRIVATE_KEY_ID; serviceAccount.private_key = process.env.FIREBASE_PRIVATE_KEY; if (getApps().length === 0) { admin.initializeApp({ credential: admin.credential.cert(serviceAccount), }); }

Uso la autenticación de Google en el lado del cliente de esta manera:

 const submit = useSubmit(); const signInWithGoogle = async () => { const provider = new GoogleAuthProvider(); const { user } = await signInWithPopup(auth, provider); if (user) { const formData = new FormData(); formData.set("user", JSON.stringify(user)); submit(formData, { method: "post" }); } };

Luego formData es manejado por mi código del lado del servidor y crea una sessionCookie con auth().createSessionCookie() .

Todo funciona bien en mi tablero (solo pueden acceder los usuarios registrados, estoy usando auth().verifySessionCookie() para verificar eso) hasta que creo un nuevo documento con la función addDoc de firebase 9. auth proviene del paquete firebase-admin .

Aquí está el código que uso:

 const addDocument = async <T>(name: string, data: T): Promise<T> => { console.log(getAuth().currentUser) // null await addDoc(collection(db, name), data as Record<string, any>); cache().deleteEntry(name); return data; };

Cuando mi regla de escritura se establece en true , funciona bien, pero cuando pongo request.auth != null tengo el error de permiso, así que supongo que el problema está en la parte de autenticación.

about 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Si bien puede estar usando Admin SDK en el servidor, ese último fragmento de código es definitivamente un SDK de JavaScript normal (ya que Admin SDK no tiene el concepto de currentUser ). Cuando inicia la sesión del usuario en el cliente, ese estado no se transporta automáticamente a su código del lado del servidor.

El enfoque más común para acceder a Firebase desde el servidor hasta hace poco era usar el SDK de administrador (que omite las reglas de seguridad) y realizar verificaciones de autorización en el código de su aplicación.

Puede usar los SDK de JavaScript normales en el servidor, pero deberá asegurarse de que estén registrados. Hay algo de trabajo en progreso para hacer esto automáticamente para Next.js y Angular Universal, pero aún no para Remix.run. La forma en que funcionan (y lo que tendrías que hacer) es que:

  1. Pasar la información de inicio de sesión en las cookies de sesión
  2. Verifique el token de ID en el código del lado del servidor con Admin SDK.
  3. Si la verificación tiene éxito, acuñan un token personalizado para el usuario.
  4. Y luego inicie sesión con ese token personalizado en el SDK de JavaScript normal.

Deberá asegurarse de tener una instancia de FirebaseApp / Auth separada para cada usuario, y probablemente querrá configurar un caché LRU para evitar tener que realizar esa traducción en cada llamada.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!